package com.atguigu.FileIO;

import org.junit.Test;

import java.io.*;

/**
 * 1.字节流和字符流
 *  1.1.字节流
 *      1.1.1.inputStream
 *      1.1.2.outputSteam
 *  1.2.字符流
 *      1.2.1.Reader
 *      1.2.1.Writer
 * 2.输入流
 *  2.1.inputstream()(FileInputStream,典型代表)
 *      2.1.1.int read():从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。如果因
 *                          为已经到达流末尾而没有可用的字节，则返回值 -1
 *      2.1.2.int read(byte arr[]):从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中。如果因为已
 *                                      经到达流末尾而没有可用的字节，则返回值 -1。否则以整数形式返回实际读取
 *                                       的字节数。
 *      2.1.2.int read(byte arr[], int off, int len):从off处开始读入，将输入流中最多 len 个数据字节读入 byte 数组。尝试读取 len 个字节，但读取
 *                                                      的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于
 *                                                          文件末尾而没有可用的字节，则返回值 -1。
 *  2.2.Reader(FileReader,典型实现）(用法同上，字节和字符区别)
 *      2.2.1.int read()
 *      2.2.2.int read(char[] c)
 *      2.2.2.int read(char[] c, int off, int len)
 *  2.3.用完之后并不会自动垃圾回收，需要显示关闭
 *  3.输出流
 *      3.1.OutputStream()(方法同上)
 *      3.2.Writer()(方法同上)
 *      3.3.因为字符流直接以字符作为操作单位，所以 Writer 可以用字符串来替换字符数组，
 *          即以 String 对象作为参数
 *      3.3.1.void write(String str);
 *      3.3.2.void write(String str, int off, int len);
 *      3.3.void flush();刷新此输出流并强制写出所有缓冲的输出字节，调用此方法指示应将这些字节立
 *                  即写入它们预期的目标
 *          void close(); 需要先刷新，再关闭此流
 * @author xiaoqi
 * @data 2021/04/13 10:51
 */
public class IOStream {
    public static void main(String[] args) {
        //输出文件
        InputStream w1 = null;
        OutputStream w2 = null;
        //创建一个字符数组
        byte[] by = new byte[50];
        int len;
        try {
            //创建一个输入流对象
            w1 = new FileInputStream("D:\\Program Files (x86)\\IdeaProjects\\JavaSenior\\src\\com\\atguigu\\FileIO\\test1.txt");
            w2 = new FileOutputStream("D:\\Program Files (x86)\\IdeaProjects\\JavaSenior\\src\\com\\atguigu\\FileIO\\test2.txt");
            //写入字符数据
            while((len = w1.read(by)) != -1){
                w2.write(by);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭文件对象
            if(w1 != null){
                try {
                    w1.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(w2 != null){
                try {
                    w2.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        //写入文件
//        FileWriter fw = null;
//        try {
//            //创建一个输入流对象
//            fw = new FileWriter("D:\\Program Files (x86)\\IdeaProjects\\JavaSenior\\src\\com\\atguigu\\FileIO\\test2.txt",true);
//            //写入字符数据
//            fw.write("12121");
//        } catch (IOException e) {
//            e.printStackTrace();
//        } finally {
//            //关闭文件对象
//            if(fw != null){
//                try {
//                    fw.close();
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
    }
}
